const jwt = require('jsonwebtoken')
const { User } = require('../models')

// JWT密钥（应该从环境变量中获取）
const JWT_SECRET = process.env.JWT_SECRET || 'smart-traffic-secret'

/**
 * 身份验证中间件 - 验证用户是否已登录
 */
const authMiddleware = async (req, res, next) => {
  try {
    // 从请求头中获取Authorization字段
    const authHeader = req.headers.authorization

    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).json({
        success: false,
        message: '未提供身份验证令牌',
      })
    }

    // 提取token
    const token = authHeader.split(' ')[1]

    // 验证token并获取用户信息
    try {
      const decoded = jwt.verify(token, JWT_SECRET)

      // 确认用户存在
      const user = await User.findByPk(decoded.id)
      if (!user) {
        return res.status(401).json({
          success: false,
          message: '用户不存在',
        })
      }

      // 将用户信息添加到请求对象
      req.user = decoded

      // 继续下一个中间件或路由处理器
      next()
    } catch (error) {
      if (error.name === 'TokenExpiredError') {
        return res.status(401).json({
          success: false,
          message: '身份验证令牌已过期',
        })
      }

      if (error.name === 'JsonWebTokenError') {
        return res.status(401).json({
          success: false,
          message: '无效的身份验证令牌',
        })
      }

      return res.status(401).json({
        success: false,
        message: '身份验证失败',
        error: error.message,
      })
    }
  } catch (error) {
    return res.status(500).json({
      success: false,
      message: '服务器错误',
      error: error.message,
    })
  }
}

/**
 * 管理员身份验证中间件 - 验证用户是否为管理员
 */
const adminMiddleware = (req, res, next) => {
  // 确保用户已登录并且角色信息存在
  if (!req.user || !req.user.role) {
    return res.status(401).json({
      success: false,
      message: '未授权，请先登录',
    })
  }

  // 检查用户是否是管理员
  if (req.user.role !== 'admin') {
    return res.status(403).json({
      success: false,
      message: '权限不足，需要管理员权限',
    })
  }

  // 用户是管理员，继续执行下一个中间件或路由处理器
  next()
}

/**
 * 管理员或交通管理员身份验证中间件 - 验证用户是否为管理员或交通管理员
 */
const adminOrTrafficMiddleware = (req, res, next) => {
  // 确保用户已登录并且角色信息存在
  if (!req.user || !req.user.role) {
    return res.status(401).json({
      success: false,
      message: '未授权，请先登录',
    })
  }

  // 检查用户是否是管理员或交通管理员
  if (req.user.role !== 'admin' && req.user.role !== 'traffic') {
    return res.status(403).json({
      success: false,
      message: '权限不足，需要管理员或交通管理员权限',
    })
  }

  // 用户权限符合要求，继续执行下一个中间件或路由处理器
  next()
}

/**
 * 验证用户令牌并返回用户信息
 */
const validateToken = async (req, res) => {
  try {
    // 从请求头中获取Authorization字段
    const authHeader = req.headers.authorization

    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).json({
        success: false,
        message: '未提供身份验证令牌',
      })
    }

    // 提取token
    const token = authHeader.split(' ')[1]

    // 验证token
    const userInfo = await verifyToken(token)

    return res.status(200).json({
      success: true,
      message: '令牌有效',
      data: {
        user: userInfo,
      },
    })
  } catch (error) {
    if (error.name === 'TokenExpiredError') {
      return res.status(401).json({
        success: false,
        message: '身份验证令牌已过期',
      })
    }

    if (error.name === 'JsonWebTokenError') {
      return res.status(401).json({
        success: false,
        message: '无效的身份验证令牌',
      })
    }

    return res.status(401).json({
      success: false,
      message: '身份验证失败',
      error: error.message,
    })
  }
}

module.exports = {
  authMiddleware,
  adminMiddleware,
  adminOrTrafficMiddleware,
  validateToken,
}
